Event-driven applications transition internal programmable objects through various supported states based on the triggering of program events. In order to handle multiple input-events acting on multiple objects, each with multiple states, event-driven applications often incorporate multiple conditional checks and/or contain several layers of filtering before an input-event is handled by a specific programmable object in a specific state. The complexities associated with handling multiple input-events and multiple programmable objects, each with multiple states, make event-driven applications difficult to maintain and results in program code that is often application specific, with the bulk of the code written to do event processing/routing through the software components. Such applications are maintenance-heavy, difficult to enhance and cannot be reused to build additional event-driven applications.